Hive UDF函数编写流程详解

参考官网:

https://cwiki.apache.org/confluence/display/Hive/HivePlugins 添加hive UDF函数
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 可查看hive内置函数

1.UDF分类:

(什么是UDF:User-Defined Function)

1
2
3
UDF: one-to-one row mapping : upper substr
UDAF: Aggregation Many-to-one row mapping sum/min
UDTF: Table-generating one-to-many lateral view explode()

2.UDF编写步骤:

2.1使用idea创建maven工程,在pom下添加以下依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <hadoop.version>2.6.0-cdh5.12.1</hadoop.version>
  <hive.version>1.1.0-cdh5.12.1</hive.version>
</properties>

<!--CDH版本需要添加repository,apache版本不需要-->
<repositories>
  <repository>
    <id>cloudera</id>
    <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
  </repository>
</repositories>


<dependencies>
  <!--添加Hadoop依赖-->
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>${hadoop.version}</version>
  </dependency>



<!--添加Hive依赖-->
  <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>${hive.version}</version>
  </dependency>
</dependencies>

3.编写 Hive UDF函数:

1)新建一个类,名字为connectUDF.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
继承UDF类,并重写evaluate方法

package com.ruozedata.hadoop.UDF;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.util.Random;

//input abc 输出:010的数字_abc
public class connectUDF extends UDF {
public String evaluate(String input){
Random random = new Random();
int num = random.nextInt(10);

return num+"_"+input;
}

2)创建第二个类,名字为splitUDF.java

1
2
3
4
5
6
7
8
9
10
11
12
继承UDF类,并重写evaluate方法

package com.ruozedata.hadoop.UDF;

import org.apache.hadoop.hive.ql.exec.UDF;

//input 1_a 输出:a
public class splitUDF extends UDF {
//input:1_abc
public String evaluate(String input) {
return input.split("_")[1];
}

4.打包编译生成jar包,注册UDF函数

生成jar包:g6-hadoop-1.0.jar

1)临时生效,即只在当前窗口生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
首先要先添加 jar,否则会找不到jar包

hive (d6_hive)> add jar /home/hadoop/lib/g6-hadoop-1.0.jar;

Added [/home/hadoop/lib/g6-hadoop-1.0.jar] to class path
Added resources: [/home/hadoop/lib/g6-hadoop-1.0.jar]

查看jar包
hive (d6_hive)> list jar;
/home/hadoop/lib/g6-hadoop-1.0.jar

创建临时函数
hive (d6_hive)> create temporary function connectUDF as 'com.ruozedata.hadoop.UDF.connectUDF';
OK
Time taken: 0.039 seconds

查看函数:发现有connectUDF函数
hive (d6_hive)> show functions;

执行函数命令:
hive (d6_hive)> select cdn,connectudf("ruoze") from g6_access limit 10;
OK
cdn _c1
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze
baidu 1_ruoze

2)永久有效,可以在多hive shell回话窗口使用udf函数

把jar包上传到hdfs,路径如下:

1
[hadoop@hadoop001 hadoop-2.6.0-cdh5.7.0]$ hadoop fs -put /home/hadoop/lib/g6-hadoop-1.0.jar /date/

执行命令:

hive (d6_hive)> CREATE FUNCTION splitUDF AS ‘com.ruozedata.hadoop.UDF.splitUDF’

USING JAR; ‘hdfs://hadoop001:8020/date/g6-hadoop-1.0.jar’

红色部分改成自己的

函数验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select * from funcs \G;
*************************** 1. row ***************************
FUNC_ID: 1
CLASS_NAME: com.ruozedata.hadoop.UDF.splitUDF
CREATE_TIME: 1555594269
DB_ID: 7
FUNC_NAME: splitudf
FUNC_TYPE: 1
OWNER_NAME: NULL
OWNER_TYPE: USER
1 row in set (0.02 sec)

表明 funcs已经永久存在元数据上,但是hive中查不到这个自定义函数,如果想在hive中直接看到,就需要编译hive源码。

从元数据中查看函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
  mysql> select * from funcs \G;
*************************** 1. row ***************************
FUNC_ID: 1
CLASS_NAME: com.ruozedata.hadoop.UDF.splitUDF
CREATE_TIME: 1555594269
DB_ID: 7
FUNC_NAME: splitudf
FUNC_TYPE: 1
OWNER_NAME: NULL
OWNER_TYPE: USER
1 row in set (0.02 sec)

表明 funcs已经永久存在元数据上,但是hive中查不到这个自定义函数,如果想在hive中直接看到,就需要编译hive源码。

本文标题:Hive UDF函数编写流程详解

文章作者:skygzx

发布时间:2019年04月18日 - 20:05

最后更新:2019年04月19日 - 07:12

原始链接:http://yoursite.com/2019/04/18/Hive UDF函数编写流程详解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%